package com.zjsru.plan2024.normal;

/**
 * 3259. 超级饮料的最大强化能量
 *
 * @Author: cookLee
 * @Date: 2024-11-02
 */
public class MaxEnergyBoost {

    /**
     * 主
     * \
     * 输入：energyDrinkA = [1,3,1], energyDrinkB = [3,1,1]
     * 输出：5
     * 解释：
     * 要想获得 5 点强化能量，需要选择只饮用能量饮料 A（或者只饮用 B）。
     * \
     * 输入：energyDrinkA = [4,1,1], energyDrinkB = [1,1,3]
     * 输出：7
     * 解释：
     * 第一个小时饮用能量饮料 A。
     * 切换到能量饮料 B ，在第二个小时无法获得强化能量。
     * 第三个小时饮用能量饮料 B ，并获得强化能量。
     * \
     *
     * @param args args
     */
    public static void main(String[] args) {
        MaxEnergyBoost maxEnergyBoost = new MaxEnergyBoost();
        int[] energyDrinkA = new int[]{4, 1, 1};
        int[] energyDrinkB = new int[]{1, 1, 3};
        System.out.println(maxEnergyBoost.maxEnergyBoost2(energyDrinkA, energyDrinkB));
    }

    /**
     * 动态规划
     *
     * @param energyDrinkA 能量饮料
     * @param energyDrinkB 能量饮料b
     * @return long
     */
    public long maxEnergyBoost(int[] energyDrinkA, int[] energyDrinkB) {
        int len = energyDrinkA.length;
        long[][] count = new long[len + 1][2];
        for (int i = 1; i <= len; i++) {
            //只加属于自己的饮料
            count[i][0] = count[i - 1][0] + energyDrinkA[i - 1];
            count[i][1] = count[i - 1][1] + energyDrinkB[i - 1];
            //此时考虑可以加另一组的能量饮料
            if (i >= 2) {
                count[i][0] = Math.max(count[i][0], count[i - 2][1] + energyDrinkA[i - 1]);
                count[i][1] = Math.max(count[i][1], count[i - 2][0] + energyDrinkB[i - 1]);
            }
        }
        return Math.max(count[len][0], count[len][1]);
    }

    /**
     * 最大能量boost2
     *
     * @param energyDrinkA 能量饮料
     * @param energyDrinkB 能量饮料b
     * @return long
     */
    public long maxEnergyBoost2(int[] energyDrinkA, int[] energyDrinkB) {
        long preA = 0L;
        long preB = 0L;
        long curA = energyDrinkA[0];
        long curB = energyDrinkB[0];

        for (int i = 1; i < energyDrinkA.length; i++) {
            long tmpA = curA;
            long tmpB = curB;
            curA = Math.max(curA, preB) + energyDrinkA[i];
            curB = Math.max(curB, preA) + energyDrinkB[i];
            preA = tmpA;
            preB = tmpB;
        }

        return Math.max(curA, curB);
    }
}
